﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
//librerias especiales para la BD
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SqlTypes;

namespace CityGames
{
    public class CADComentario
    {
        static private string cadConexion = System.Configuration.ConfigurationManager.ConnectionStrings["CityGames.Properties.Settings.BDCityGamesConnectionString"].ConnectionString;

        /************************************************** Funciones de Marcos **************************************************/

        /// <summary>
        /// Función que ejecuta la consulta pasada por parámetro en Modo Desconectado y devuelve un DataSet con el resultado en una tabla denominada con el nombre especificado
        /// </summary>
        /// <param name="select">
        /// Sentencia Select SQL que se va a ejecutar</param>
        /// <param name="nombreTabla">
        /// Nombre que tendrá la tabla con los datos en el DataSet que devuelve la función</param>
        /// <returns>
        /// Devuelve un DataSet con el resultado de la consulta ejecutado en modo desconectado</returns>
        public DataSet ObtenerDatos(string select, string nombreTabla)
        {
            DataSet resultado = new DataSet();

            try
            {
                SqlConnection conexion = new SqlConnection(cadConexion);
                SqlDataAdapter da = new SqlDataAdapter(select, conexion);
                da.Fill(resultado, nombreTabla);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// Función para actualizar la Base de Datos con las modificaciones realizadas sobre el DataSet pasado por parámetro.
        /// </summary>
        /// <param name="datosModificados">
        /// DataSet con los cambios que se desean aplicar a la Base de Datos</param>
        /// <param name="select">
        /// Sentencia SQL Select original con la que se rellenó el DataSet</param>
        /// <returns>Devuelve True si todo ha ido bien, False en caso contrario</returns>
        public bool InsertarDatosModificados(DataSet datosModificados, string select)
        {
            bool resultado = false;

            try
            {
                SqlConnection conexion = new SqlConnection(cadConexion);
                SqlDataAdapter da = new SqlDataAdapter(select, conexion);
                SqlCommandBuilder cb = new SqlCommandBuilder(da);
                da.Update(datosModificados, datosModificados.Tables[0].TableName);

                resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        public DataSet ObtenerComentariosDeJuego(string nombreJuego, string plataformaJuego)
        {
            DataSet resultado = new DataSet();

            try
            {
                string select = "SELECT IDComentario, UsuarioWeb, Avatar, Comentario, FechaPublicacion ";
                select += "FROM Comentario, Socio ";
                select += "WHERE (DNI = DNISocio) AND (NombreJuego = '" + nombreJuego + "') AND (PlataformaJuego = '" + plataformaJuego + "') ";
                select += "ORDER BY FechaPublicacion DESC";

                resultado = ObtenerDatos(select, "Comentarios");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        public bool InsertarComentario(string dniSocio, string nombreJuego, string plataformaJuego, string comentario, DateTime fechaPublicacion)
        {
            bool resultado = false;
            string insert = "";

            SqlConnection conexion = null;
            SqlCommand comando = null;

            try
            {
                int idComentario = ObtenerMaximaIDComentario() + 1;

                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                insert = "INSERT INTO Comentario (IDComentario, DNISocio, NombreJuego, PlataformaJuego, Comentario, FechaPublicacion) ";
                insert += "VALUES (@IDComentario, @dniSocio, @nombreJuego, @plataformaJuego, @comentario, @fechaPublicacion)";

                comando = new SqlCommand(insert, conexion);
                comando.Parameters.Add("@IDComentario", SqlDbType.Int);
                comando.Parameters["@IDComentario"].Value = idComentario;
                comando.Parameters.Add("@dniSocio", SqlDbType.VarChar, 9);
                comando.Parameters["@dniSocio"].Value = dniSocio;
                comando.Parameters.Add("@nombreJuego", SqlDbType.VarChar, 50);
                comando.Parameters["@nombreJuego"].Value = nombreJuego;
                comando.Parameters.Add("@plataformaJuego", SqlDbType.VarChar, 20);
                comando.Parameters["@plataformaJuego"].Value = plataformaJuego;
                comando.Parameters.Add("@comentario", SqlDbType.VarChar, 500);
                comando.Parameters["@comentario"].Value = comentario;
                comando.Parameters.Add("@fechaPublicacion", SqlDbType.DateTime);
                comando.Parameters["@fechaPublicacion"].Value = fechaPublicacion;

                comando.ExecuteNonQuery();

                resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        private int ObtenerMaximaIDComentario()
        {
            int resultado = 0;

            SqlConnection conexion = null;
            SqlCommand comando = null;
            SqlDataReader dr = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                string select = "SELECT TOP(1) IDComentario FROM Comentario ORDER BY IDComentario DESC";
                comando = new SqlCommand(select, conexion);
                dr = comando.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr["IDComentario"].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        public bool BorrarComentarioDeJuego(int idComentario)
        {
            bool resultado = false;

            string delete = "";
            SqlConnection conexion = null;
            SqlCommand comando = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                delete = "DELETE FROM Comentario WHERE (IDComentario = @idComentario)";
                comando = new SqlCommand(delete, conexion);
                comando.Parameters.Add("@idComentario", SqlDbType.Int);
                comando.Parameters["@idComentario"].Value = idComentario;

                comando.ExecuteNonQuery();

                resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /************************************************** Fin Funciones de Marcos **************************************************/
    }
}
